/**
 * 游戏 帮助类
 */
class GameHelper {

    /**
     * 单例实例
     */
    private static instance: GameHelper = null;

    /**
     * 编译顺序 标识
     */
    public static referenceFlag: string = CommonData.referenceFlag;

    /**
     * Egret 相关属性
     */
    public stageWidth: number = 0; // 舞台 宽度
    public stageHeight: number = 0; // 舞台 高度

    /**
     * 物理 相关属性
     */
    public collisionDistance: number = 3; // 物体 碰撞时 间隔距离
    public staticShapeList: Array<egret.Rectangle> = []; // 物理空间 所有 静态类型 物理对象 Rectangle 列表

    public keyBoardDelayFlag: boolean = false; // 键盘事件 延迟 标识
    public tickLogTime: number = 0; // Ticker 实时 时间 记录
    public keyBoardActiveTime: number = 0; // 取消 键盘事件 延迟 时间


    /**
     * 获取 单例实例
     */
    public static get getInstance(): GameHelper {

        if (GameHelper.instance == null) {
            GameHelper.instance = new GameHelper();
        }
        return GameHelper.instance;
    }

    /**
     * 构造函数
     */
    public constructor() {

    }


    /**
     * 初始化 函数
     * @param setStageWidth
     * @param setStageHeight
     */
    public init(setStageWidth: number, setStageHeight: number): void {

        this.stageWidth = setStageWidth;
        this.stageHeight = setStageHeight;
    }


    /**
     * Egret 空间坐标 与 自定义 空间坐标，相互映射 函数
     * (10 , 4 - 10 = 6 , 6 - 10 = 4)
     * @param x
     * @param y
     */
    public createMapPoint(x: number, y: number): egret.Point {

        let stageHeight: number = this.stageHeight;
        let point: egret.Point = new egret.Point(x, y); // 获取 Egret 实际坐标
        point.y = -1 * (point.y - stageHeight);

        return point;
    }

    /**
     * 返回 自定义 空间 Y轴 单位值
     * @param val
     */
    public convertPositionY(val: number): number {

        let addVal: number = -1 * val;
        return addVal;
    }

    /**
     * 根据 name关键字，创建 Bitmap对象
     * @param name
     */
    public createBitmapByName(name: string): egret.Bitmap {
        let result = new egret.Bitmap();
        let texture: egret.Texture = RES.getRes(name);
        result.texture = texture;
        return result;
    }

    /**
     * 键盘事件 延迟 监听 通知
     */
    public keyBoardDelay(): void {

        let delayTime: number = 500; // 至少 延迟 时间
        this.keyBoardActiveTime = this.tickLogTime + delayTime; // 重启 时间
        this.keyBoardDelayFlag = true; // 延迟 标识
    }

    /**
     * 键盘事件 激活 通知
     */
    private keyBoardActive(): boolean {

        let isAllow: boolean = this.tickLogTime > this.keyBoardActiveTime;

        if (isAllow == true) {
            this.keyBoardDelayFlag = false; // 取消 延迟 状态
            return true;
        }

        return false;
    }

    /**
     * 获取 键盘对象 状态
     */
    public getKeyBoardStatus(): boolean {

        let isDelay: boolean = this.keyBoardDelayFlag; // 延迟 标识
        let isActive: boolean = true; // 激活 请求 反馈

        if (isDelay == true) { // 假如 处于 键盘事件 延迟 状态
            isActive = this.keyBoardActive(); // 发起 激活 请求
        }

        if (isActive == false) { // 激活 请求 失败，跳过 此次 键盘事件
            return false;
        }

        return true;
    }

}